
#include "software_serial.h"

// 串口初始化，PA-9设置为推挽输出
void SoftwareSerialPortInit(void)
{
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    GPIO_InitTypeDef GPIO_InitStruct;

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &GPIO_InitStruct);
    PAout(9) = 1;
}

// 将一个数通过串口以高低电平输出二进制值
// 更改波特率也要更改delayUS参数的值
void SoftwareSerialPortPutc(const char ch)
{
    // GPIO_SetBits(GPIOA, GPIO_Pin_9); // 一位起始位高
    PAout(9) = 1;
    DelayUS(104);
    // GPIO_ResetBits(GPIOA, GPIO_Pin_9); // 一位起始位低
    PAout(9) = 0;
    DelayUS(104);
    // 八位数据位
    for (int i = 0; i < 8; i++)
    {
        /*
        if (((ch >> i) & 1) == 1)
        {
            GPIO_SetBits(GPIOA, GPIO_Pin_9);
        }
        else
        {
            GPIO_ResetBits(GPIOA, GPIO_Pin_9);
        }
        */
        PAout(9) = ch >> i & 1;
        DelayUS(104);
    }
    // 数据位与结束位之间可以有一位校验位
    // GPIO_SetBits(GPIOA, GPIO_Pin_9); // 一位停止位高
    PAout(9) = 1;
    DelayUS(104);
}

// 通过串口输出一个字符串
void SoftwareSerialPortPuts(const char *str)
{
    while (*str != '\0')
    {
        SoftwareSerialPortPutc(*str);
        str++;
    }
}
